#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    //ui->record->setEnabled(false);
    ui->port->setText("8080"); // 设置默认端口号
    setWindowTitle("服务器") ;
    printHostIPAddresses();

    // 实例化监听的服务器对象
    m_s = new QTcpServer(this);

    // 等待客户链接，当有客户端链接到达时，QtcpServer对象可以发射出一个信号(newConnection)
    connect(m_s,&QTcpServer::newConnection,this,[=](){
        m_tcp = m_s->nextPendingConnection(); // 通过调用此函数获取一个Socket实例对象

        ui->C_status->setText("已连接");

        // 实例对象什么时候可以接收数据:(检测是否可以接收数据),就是这个实例对象发射readyread信号时
        connect(m_tcp,&QTcpSocket::readyRead,this,[=](){
            QByteArray data = m_tcp->readAll();
            ui->record->append(data); // 追加进通信记录中

        });

        // 断开连接
        connect(m_tcp, &QTcpSocket::disconnected,this,[=](){
            m_tcp->close();
            m_tcp->deleteLater();
            ui->C_status->setText("未连接");
        });
    });



    // 处理状态栏
//    m_status = new QLabel(this);
//    ui->statusBar->addWidget(new QLabel("当前连接状态:"));
//    ui->statusBar->addWidget(m_status);

    ui->C_status->setText("未连接");
}

MainWindow::~MainWindow()
{
    delete ui;
}


void MainWindow::on_setListen_clicked()
{
    unsigned short port = ui->port->text().toUShort(); // 读出端口号并转换成无符号短整型
    m_s->listen(QHostAddress::Any, port); // 启动监听，绑定IP与端口
    ui->setListen->setText("已启用监听");
    ui->setListen->setEnabled(false); // 绑定后按钮设置为不可用
    // ui->record->append("已启用监听服务!");

    ui->record->append(MyHost + "已启用监听服务");
}

void MainWindow::on_sendMsg_clicked()
{
    QString msg = ui->msg->toPlainText(); // 将数据以纯文本的方式取出来
    m_tcp->write(msg.toUtf8());
    ui->record->append("服务器say: " + msg); // 追加进通信记录中
    ui->msg->setText("");
}

// 获取主机Ipv4地址
void MainWindow::printHostIPAddresses() {
    QList<QNetworkInterface> interfaces = QNetworkInterface::allInterfaces();
    foreach (QNetworkInterface interface, interfaces) {
        if (interface.flags().testFlag(QNetworkInterface::IsUp) && !interface.flags().testFlag(QNetworkInterface::IsLoopBack)) {
            QList<QNetworkAddressEntry> entries = interface.addressEntries();
            foreach (QNetworkAddressEntry entry, entries) {
                // 输出所有类型的IP地址
                //qDebug() << "IP Address:" << entry.ip().toString();

                // 如果你只想要IPv4地址，可以添加以下检查
                if (entry.ip().protocol() == QAbstractSocket::IPv4Protocol) {
                    //qDebug() << "IPv4 Address:" << entry.ip().toString();
                    MyHost = entry.ip().toString();
                }
            }
        }
    }
}
















